package main

import (
	"bufio"
	"fmt"
	"os"
	"stack"
	"strconv"
	"strings"
)

// 编写一个简单的逆波兰式计算器，它接受用户输入的整型数（最大值 999999）和运算符 +、-、*、/。
// 输入的格式为：number1 ENTER number2 ENTER operator ENTER --> 显示结果
// 当用户输入字符 'q' 时，程序结束。请使用您在练习 11.13 中开发的 stack 包。

func main() {
	inputReader := bufio.NewReader(os.Stdin)
	fmt.Println("请输入整数和运算符: ")
	statck := new(stack.Stack)
	for {
		input, err := inputReader.ReadString('\n')
		if err != nil {
			fmt.Println("error: ", err.Error())
			return
		}
		input = strings.TrimRight(input, "\n")

		switch {
		case input == "q":
			fmt.Println("calculator stoped.")
			return
		case input >= "0" && input <= "999999":
			num, _ := strconv.Atoi(input)
			statck.Push(num)
		case input == "+":
			a, b := pop2Int(statck)
			fmt.Printf("%d %s %d = %v\n", a, "+", b, a+b)
		case input == "-":
			a, b := pop2Int(statck)
			fmt.Printf("%d %s %d = %v\n", a, "-", b, a-b)
		case input == "*":
			a, b := pop2Int(statck)
			fmt.Printf("%d %s %d = %v\n", a, "*", b, a*b)
		case input == "/":
			a, b := pop2Int(statck)
			fmt.Printf("%d %s %d = %v\n", a, "/", b, a/b)
		default:
			fmt.Println("incorrect input.")
		}
	}
}

func pop2Int(s *stack.Stack) (a, b int) {
	b, a = s.Pop(), s.Pop()
	return
}
